package com.wfbi.security.chapter2;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.builders.WebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.crypto.password.NoOpPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.web.util.matcher.AntPathRequestMatcher;

/**
 * @author wfbi
 * @version 1.0
 * @date 2021/12/27 2:13 PM
 */
@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    /**
     * 采用不加密策略
     *
     * @author: wfbi
     * @date: 2021/12/27 2:18 PM
     * @return: org.springframework.security.crypto.password.PasswordEncoder
     **/
    @Bean
    PasswordEncoder passwordEncoder() {
        return NoOpPasswordEncoder.getInstance();
    }

    /**
     * 内存中定义用户
     *
     * @param auth:
     * @author: wfbi
     * @date: 2021/12/27 2:17 PM
     * @return: void
     **/
    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication()
                .withUser("wfbi")
                .password("wfbi")
                .roles("admin");
    }


    @Override
    public void configure(WebSecurity web) throws Exception {
        // 配置忽略掉的 URL 地址，一般对于静态文件
        web.ignoring().antMatchers("/js/**", "/css/**", "/images/**");
    }

    /**
     * 权限配置
     *
     * @param http:
     * @author: wfbi
     * @date: 2021/12/27 2:23 PM
     * @return: void
     **/
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                .anyRequest().authenticated()
                .and()
                // 表单相关配置
                .formLogin()
                // 设置登录页面
                .loginPage("/login.html")
                // 设置登录提交路径，默认和loginPage同值
                .loginProcessingUrl("/doLogin")
                // 设置登录表单用户名关键变量
                .usernameParameter("name")
                // 设置登录表单用户密码关键变量
                .passwordParameter("passwd")
                // 提交成功跳转地址，默认/，直接请求登录页会登录成功跳转该地址，若请求其他地址重定向登录页面登录成功后跳到初始请求地址
                .defaultSuccessUrl("/home1")
                // 不管是否请求登录页登录，成功后都跳转该地址。和defaultSuccessUrl设置一个就可，两者都用于前后端不分离
//                .successForwardUrl("/home2")
                // 失败，后台跳转
                .failureForwardUrl("/f2")
                // 失败，前端重定向。和failureForwardUrl设置一个就可
                .failureUrl("/f1")
                .permitAll()
                .and()
                // 注销登录相关配置
                .logout()
                // 默认注销的 URL 是 /logout，是一个 GET 请求，我们可以通过 logoutUrl 方法来修改默认的注销 URL
                .logoutUrl("/logout")
                // logoutRequestMatcher 方法不仅可以修改注销 URL，还可以修改请求方式，实际项目中，这个方法和 logoutUrl 任意设置一个即可
//                .logoutRequestMatcher(new AntPathRequestMatcher("/logout", "POST"))
                // logoutSuccessUrl 表示注销成功后要跳转的页面，默认登录页面
                .logoutSuccessUrl("/doLogout")
                // deleteCookies 用来清除 cookie, 默认会删除
                .deleteCookies()
                // clearAuthentication 和 invalidateHttpSession 分别表示清除认证信息和使 HttpSession 失效，默认可以不用配置，默认就会清除
                .clearAuthentication(true)
                .invalidateHttpSession(true)
                .permitAll()
                .and()
                .csrf().disable();
    }
}
